/**
 * 官方仓库 @set https://github.com/Hexagon/croner
 */
import { Cron } from "croner";
import fso from "@/utils/FileOperate/operate";

/** 后台任务名称 */
// export type CronJobNames = "CHECK_WEBSOCKET_CONNECT";
export type CronJobNames = "CHECK";

/**
 * cron 任务映射, (注意: 在后台无法执行, 切到前台则会马上执行)
 * cron 解析网站 @set http://cron.ciding.cc
 *
 * 每天8:30执行: 0 30 8 * * ?
 * 每30秒执行: 30 * * * * ?
 * 每 10, 20,30秒 执行: 10,20,30 * * * * ?
 */
export const cronJobMap: { [k in CronJobNames]: Cron | null } = {
  CHECK: null
};

/** 获取 cron 任务实例 */
export const getCronTaskInstace = (taskName: CronJobNames) => {
  return cronJobMap[taskName];
};

/** 设置 cron 任务实例 */
export const setCronTaskInstace = (taskName: CronJobNames, value: Cron | null) => {
  cronJobMap[taskName] = value;
};

/**
 * 开始定时任务
 * @param taskName cron 任务名称
 * @param cronExpr cron 表达式
 * @param callback cron 执行回调
 */
export const startTask = (
  taskName: CronJobNames,
  cronExpr: string,
  callback: (taskName: CronJobNames, cronExpr: string, job: Cron | null) => void
) => {
  const job = getCronTaskInstace(taskName);

  if (job) {
    fso.info("停止已经存在的 cron 任务");
    job.stop();
  }

  fso.info("启动 cron 任务, 表达式为: ", cronExpr);
  cronJobMap[taskName] = Cron(cronExpr, () => {
    callback(taskName, cronExpr, getCronTaskInstace(taskName));
  });
};

/**
 * 停止定时任务
 * @param taskName cron 任务名称
 * @returns
 */
export const stopTask = (taskName: CronJobNames) => {
  const job = getCronTaskInstace(taskName);

  if (job) {
    job.stop();
    setCronTaskInstace(taskName, null);
    fso.info("停止 cron 任务");
    return true;
  } else {
    fso.warn("停止失败, 没有 cron 任务");
    return false;
  }
};
